package br.com.fiap.beans.validator;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;

import br.com.fiap.beans.vo.CompraVO;
import br.com.fiap.dao.TrechoDAO;
import br.com.fiap.dao.impl.TrechoDAOImpl;
import br.com.fiap.entity.Trecho;
import br.com.fiap.entity.Voo;

@Named
@FacesValidator("br.com.fiap.beans.validator.AssentosDisponiveisEconomicaValidator")
public class AssentosDisponiveisEconomicaValidator implements Validator, Serializable {
	
	private static final long serialVersionUID = 8675036450024073166L;

	private TrechoDAO trechoDAO = new TrechoDAOImpl();
	
	@Override
	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

		List<FacesMessage> msgErros = new LinkedList<FacesMessage>();
		
		if (value == null || "".equals(value.toString())) {
			FacesMessage msg = new FacesMessage("A quantidade de assentos deve ser informada.", "Valor invalido.");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			msgErros.add(msg);
		}
		
		CompraVO compraVO = (CompraVO) component.getValueExpression("compraVO").getValue(context.getELContext());

		Long trechoId = compraVO.getTrecho().getId();
		Trecho trecho = trechoDAO.findById(trechoId);
		
		if (trecho != null && trecho.getVoo() != null) {
			
			Voo voo = trecho.getVoo();
			
			Integer qtdEconomica = (Integer) value;
			
			if (voo.getTotalAssentosEconomicos() - qtdEconomica < 0) {
				Integer assentosOcupados = voo.getAssentosEconomicosOcupados() == null ? 0 : voo.getAssentosEconomicosOcupados();
				Integer assentosDisponiveis = voo.getTotalAssentosEconomicos() - assentosOcupados;
				FacesMessage msg = new FacesMessage("Existem apenas " + assentosDisponiveis + " assentos disponiveis para a classe Economica.", "Valor invalido.");
				msg.setSeverity(FacesMessage.SEVERITY_ERROR);
				msgErros.add(msg);
			}
			
			if (!msgErros.isEmpty()) {
				throw new ValidatorException(msgErros);
			}
			
		}
	}

}
